//package lambdasinaction.chap7;
//
//import java.util.concurrent.TimeUnit;
//import java.util.stream.LongStream;
//import java.util.stream.Stream;
//
//import org.openjdk.jmh.annotations.Benchmark;
//import org.openjdk.jmh.annotations.BenchmarkMode;
//import org.openjdk.jmh.annotations.Fork;
//import org.openjdk.jmh.annotations.Level;
//import org.openjdk.jmh.annotations.Measurement;
//import org.openjdk.jmh.annotations.Mode;
//import org.openjdk.jmh.annotations.OutputTimeUnit;
//import org.openjdk.jmh.annotations.Scope;
//import org.openjdk.jmh.annotations.State;
//import org.openjdk.jmh.annotations.TearDown;
//import org.openjdk.jmh.annotations.Warmup;
//
//@State(Scope.Thread)
//@BenchmarkMode(Mode.AverageTime)
//@OutputTimeUnit(TimeUnit.MILLISECONDS)
//@Fork(value=2, jvmArgs={"-Xms4G", "-Xmx4G"})
//@Measurement(iterations=2)
//@Warmup(iterations=3)
//public class ParallelStreamBenchmark {
//
//    private static final long N = 10_000_000L;
//
//    @Benchmark
//    public long iterativeSum() {
//        long result = 0;
//        for (long i = 1L; i <= N; i++) {
//            result += i;
//        }
//        return result;
//    }
//
//    @Benchmark
//    public long sequentialSum() {
//        return Stream.iterate( 1L, i -> i + 1 ).limit(N).reduce( 0L, Long::sum );
//    }
//
//    @Benchmark
//    public long parallelSum() {
//        return Stream.iterate(1L, i -> i + 1).limit(N).parallel().reduce( 0L, Long::sum);
//    }
//
//    @Benchmark
//    public long rangedSum() {
//        return LongStream.rangeClosed( 1, N ).reduce( 0L, Long::sum );
//    }
//
//    @Benchmark
//    public long parallelRangedSum() {
//        return LongStream.rangeClosed(1, N).parallel().reduce( 0L, Long::sum);
//    }
//
//    @TearDown(Level.Invocation)
//    public void tearDown() {
//        System.gc();
//    }
//}
